#ifndef AUTHMANAGER_H
#define AUTHMANAGER_H

#include <QObject>
#include <QString>
#include <QHash>
#include <QCryptographicHash>
#include <QJsonObject>
#include <QFile>
#include <QJsonDocument>
#include <QJsonArray>
#include <QDateTime>

#include "../logging/logger.h"

// 定义用户类型枚举
enum class UserRole {
    Admin,      // 管理员
    Standard,   // 标准用户
    Guest       // 访客
};

// 用户信息结构
struct UserInfo {
    QString username;
    QString passwordHash;  // 存储密码的哈希值
    QString salt;          // 盐值
    UserRole role;
    QString lastLoginTime;
    QString lastLoginIP;
};

class AuthManager : public QObject
{
    Q_OBJECT

public:
    static AuthManager* getInstance();
    
    // 用户注册
    bool registerUser(const QString &username, const QString &password, UserRole role = UserRole::Standard);
    
    // 用户认证
    bool authenticateUser(const QString &username, const QString &password);
    
    // 修改密码
    bool changePassword(const QString &username, const QString &oldPassword, const QString &newPassword);
    
    // 获取用户信息
    UserInfo getUserInfo(const QString &username) const;
    
    // 检查用户是否存在
    bool userExists(const QString &username) const;
    
    // 保存用户信息到文件
    bool saveUsersToFile(const QString &filePath);
    
    // 从文件中加载用户信息
    bool loadUsersFromFile(const QString &filePath);
    
    // 获取当前登录的用户
    QString getCurrentUser() const;
    
    // 检查当前用户权限
    bool checkPermission(UserRole requiredRole) const;
    
    // 用户登出
    void logout();

signals:
    // 登录成功信号
    void loginSuccess(const QString &username, UserRole role);
    
    // 登录失败信号
    void loginFailed(const QString &reason);
    
    // 用户登出信号
    void userLogout();

private:
    explicit AuthManager(QObject *parent = nullptr);
    ~AuthManager();
    
    static AuthManager* instance;
    
    QHash<QString, UserInfo> users;  // 用户名 -> 用户信息
    QString currentUser;             // 当前登录的用户
    
    // 生成密码哈希
    QString hashPassword(const QString &password, const QString &salt);
    
    // 生成随机盐值
    QString generateSalt();
    
    // 将用户角色转换为字符串
    QString roleToString(UserRole role);
    
    // 将字符串转换为用户角色
    UserRole stringToRole(const QString &roleStr);
};

#endif // AUTHMANAGER_H 